package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.TrackInfoService;
import com.atguigu.tingshu.album.service.VodService;
import com.atguigu.tingshu.common.login.Login;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.TrackInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumTrackListVo;
import com.atguigu.tingshu.vo.album.TrackInfoVo;
import com.atguigu.tingshu.vo.album.TrackListVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

@Tag(name = "声音管理")
@RestController
@RequestMapping("api/album/trackInfo")
@SuppressWarnings({"all"})
public class TrackInfoApiController {

    @Autowired
    private TrackInfoService trackInfoService;

    @Resource
    private VodService vodService;

    /**
     * 批量获取下单付费声音列表
     * @param trackId
     * @param trackCount
     * @return
     */
    @Login
    @Operation(summary = "批量获取下单付费声音列表")
    @GetMapping("/findPaidTrackInfoList/{trackId}/{trackCount}")
    public Result<List<TrackInfo>> findPaidTrackInfoList(@PathVariable("trackId") Long trackId, @PathVariable("trackCount") Integer trackCount){
        //  用户Id
        Long userId = AuthContextHolder.getUserId();
        //  调用服务层方法：
        List<TrackInfo> trackInfoList = trackInfoService.findPaidTrackInfoList(trackId, trackCount, userId);
        //  返回数据;
        return Result.ok(trackInfoList);
    }

    /**
     * 获取用户声音购买列表
     * @param trackId
     * @return
     */
    @Login
    @Operation(summary = "获取声音分集购买列表")
    @GetMapping("/findUserTrackPaidList/{trackId}")
    public Result  findUserTrackPaidList(@PathVariable("trackId") Long trackId) {
        //  获取用户Id
        Long userId = AuthContextHolder.getUserId();
        //  调用服务层方法：
        List<Map<String,Object>> map = trackInfoService.findUserTrackPaidList(trackId, userId);
        //  返回数据
        return Result.ok(map);
    }

    //http://localhost/api/album/trackInfo/findAlbumTrackPage/{albumId}/{pageNO}/{pageSize}
    /**
     * 查询声音列表
     * @param albumId
     * @param pageNO
     * @param pageSize
     * @return
     */
    @Login
    @Operation(summary = "查询声音列表")
    @GetMapping("/findAlbumTrackPage/{albumId}/{pageNO}/{pageSize}")
    public Result findAlbumTrackPage(
            @PathVariable Long albumId,
            @PathVariable Long pageNO,
            @PathVariable Long pageSize
    ){
        //获取用户id:可以为空，为空表是没有登录
        Long userId = AuthContextHolder.getUserId();
        //封装page信息
        Page<AlbumTrackListVo> page = new Page<>(pageNO, pageSize);
        //调用服务层方法
        IPage<AlbumTrackListVo> iPage =trackInfoService.findAlbumTrackPage(page,albumId,userId);
        //返回结果
        return Result.ok(iPage);
    }

    /**
     * 根据trackId更新声音信息
     * @param trackId
     * @param trackInfoVo
     * @return
     */
    @Operation(summary = "根据trackId更新声音信息")
    @PutMapping("/updateTrackInfo/{trackId}")
    public Result updateTrackInfo(
           @PathVariable  Long trackId,
           @RequestBody TrackInfoVo trackInfoVo
    ){
        //调用服务层方法
        trackInfoService.updateTrackInfo(trackId,trackInfoVo);
        //返回数据
        return Result.ok();
    }


    /**
     * 根据trackid查询声音信息
     * @param trackId
     * @return
     */
    @Operation(summary = "根据trackid查询声音信息")
    @GetMapping("/getTrackInfo/{trackId}")
    public Result getTrackInfo(@PathVariable Long trackId){
        //调用服务层
        TrackInfo trackInfo = trackInfoService.getById(trackId);
        //返回结果
        return Result.ok(trackInfo);
    }

    /**
     *v根据声音id删除声音
     * @param trackId
     * @return
     */
    @Operation(summary = "根据声音id删除声音")
    @DeleteMapping("/removeTrackInfo/{trackId}")
    public Result removeTrackInfo(@PathVariable Long trackId){
        //调用服务层的方法
        trackInfoService.removeTrackInfo(trackId);
        //返回结果
        return Result.ok();
    }

    @Operation(summary = "分页查询声音列表")
    @PostMapping("/findUserTrackPage/{pageNum}/{pageSize}")
    @Login
    public Result findUserTrackPage(
            @PathVariable("pageNum") Long pageNum,
            @PathVariable("pageSize") Long pageSize,
            @RequestBody TrackInfoQuery trackInfoQuery
            ){
        //构建page信息
        Page<TrackListVo> page = new Page<TrackListVo>(pageNum, pageSize);
        //	获取用户Id
        Long userId = null == AuthContextHolder.getUserId() ? 1l : AuthContextHolder.getUserId();
        trackInfoQuery.setUserId(userId);
        //调用服务层方法
        IPage<TrackListVo> trackListVoIPage = trackInfoService.findUserTrackPage(page,trackInfoQuery);
        //返回结果
        return Result.ok(trackListVoIPage);
    }

    @Operation(summary = "保存声音")
    @PostMapping("/saveTrackInfo")
    @Login
    public Result saveTrackInfo(@RequestBody TrackInfoVo trackInfoVo) {
        //获取用户id
        Long userId = null == AuthContextHolder.getUserId() ? 1l : AuthContextHolder.getUserId();
        //调用服务层方法
        trackInfoService.saveTrackInfo(trackInfoVo, userId);
        //返回值
        return Result.ok();
    }


    @Operation(summary = "上传声音")
    @PostMapping("/uploadTrack")
    public Result<Map<String, Object>> uploadTrack(MultipartFile file) {
        //调用服务层方法
        Map<String, Object> map = vodService.uploadTrack(file);
        //返回结果
        return Result.ok(map);
    }

}

